import 'package:flutter/material.dart';

void main() {
  // 1. 运行应用程序。
  runApp(const MyApp());
}

// 2. 根组件，有且只有一个。
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个 Widget 是应用程序的根。
  @override
  Widget build(BuildContext context) {
    // 3. 指定程序的 UI 主题。
    return MaterialApp(
      title: 'Flutter 示例',
      theme: ThemeData(
        // 这是应用程序的主题。
        //
        // 尝试这样做：尝试用“flutter run”运行你的应用程序。你会看到应用程序有一个紫色的工具栏。然后，在不退出应用程序的情况下，
        // 尝试将下面 colorScheme 中的 seedColor 改为 Colors.green，然后调用“热重载”（保存你的更改或在支持 Flutter 的 IDE 中按“热重载”按钮，或者如果你是用命令行启动的应用程序，则按“r”）。
        //
        // 注意计数器没有重置回零；应用程序状态在重载期间不会丢失。要重置状态，请使用热重启。
        //
        // 这对代码也适用，而不仅仅是值：大多数代码更改可以通过热重载进行测试。
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter 示例主页'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // 这个小部件是你应用程序的首页。它是有状态的，意味着它有一个 State 对象（在下面定义），
  // 该对象包含影响其外观的字段。

  // 这个类是状态的配置。它持有父组件（在这种情况下是 App 小部件）提供的值（在这种情况下是标题），
  // 并由 State 的 build 方法使用。小部件子类中的字段总是标记为“final”。

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      // 这个调用 setState 告诉 Flutter 框架这个 State 发生了变化，这会导致下面的 build 方法重新运行，
      // 从而使显示能够反映更新的值。如果我们改变了 _counter 而不调用 setState()，那么 build 方法不会再次被调用，
      // 因此什么也不会发生。
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    // 每次调用 setState 时都会重新运行这个方法，例如上面的 _incrementCounter 方法所做的那样。
    //
    // Flutter 框架已经优化以使重新运行 build 方法变得快速，因此你可以重建任何需要更新的内容，而不需要单独更改小部件实例。
    return Scaffold(
      appBar: AppBar(
        // 尝试这样做：尝试在这里将颜色更改为特定颜色（例如 Colors.amber），然后触发热重载，以查看 AppBar 颜色发生变化，而其他颜色保持不变。
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        // 这里我们从 MyHomePage 对象中获取值，该对象是由 App.build 方法创建的，并用它来设置我们的应用栏标题。
        title: Text(widget.title),
      ),
      body: Center(
        // Center 是一个布局小部件。它接受一个子小部件并将其定位在父小部件的中间。
        child: Column(
          // Column 也是一个布局小部件。它接受一个子小部件列表并将它们垂直排列。默认情况下，它会水平适应其子小部件的大小，并尝试与其父小部件一样高。
          //
          // Column 有各种属性来控制其自身的大小和子小部件的位置。这里我们使用 mainAxisAlignment 将子小部件垂直居中；
          // 主轴在这里是垂直轴，因为 Columns 是垂直的（交叉轴将是水平的）。
          //
          // 尝试这样做：调用“调试绘制”（在 IDE 中选择“切换调试绘制”操作，或在控制台中按“p”），以查看每个小部件的线框。
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '你已经按了按钮这么多次：',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: '增加',
        child: const Icon(Icons.add),
      ), // 这个尾随逗号使得自动格式化在构建方法中更好看。
    );
  }
}
